(*
   Utilise par get_contour. Elle verifie si les pixels voisins
   existent (qu'ils ne soient pas en dehors de l'image) et stoque les
   couleurs dans un vecteur et retourne si toutes les couleurs sont
   les memes.
*)
let test_contour img x y w h =
  let color = Sdlvideo.get_pixel_color img x y in
  let nbcolors = ref 1 in
  let colors = Array.make 5 color in
  let result = ref true in
    if ((x - 1) >= 0) then
      begin
	colors.(!nbcolors) <- Sdlvideo.get_pixel_color img (x - 1) y;
	nbcolors := !nbcolors + 1;
      end
    else ();
    if ((x + 1) <= w) then
      begin
        colors.(!nbcolors) <- Sdlvideo.get_pixel_color img (x + 1) y;
        nbcolors := !nbcolors + 1
      end
    else ();
    if ((y - 1) >= 0) then
      begin
	colors.(!nbcolors) <- Sdlvideo.get_pixel_color img x (y - 1);
	nbcolors := !nbcolors + 1
      end
    else ();
    if ((y + 1) <= h) then
      begin
     	colors.(!nbcolors) <- Sdlvideo.get_pixel_color img x (y + 1);
	nbcolors := !nbcolors + 1
      end
    else ();
    for i = 0 to (!nbcolors - 2) do
      result := (!result && ( colors.(i) = ( colors.(i+1) ) ) );
    done;
    !result

(*
   Fait l'image des contours de 'img' sur 'cntr' (contours en noir,
   le reste ne blanc).
*)
let get_contour img cntr =
  let w = (Sdlvideo.surface_info img).Sdlvideo.w in
  let h = (Sdlvideo.surface_info img).Sdlvideo.h in
    for i = 0 to (w - 1) do
      for j = 0 to (h - 1) do
  	if (test_contour img i j (w-1) (h-1)) then
  	  Sdlvideo.put_pixel_color cntr i j Sdlvideo.white
	else
	  Sdlvideo.put_pixel_color cntr i j Sdlvideo.black;
      done;
    done

(*
  Prends l'image de base ('img'), celle des contours ('cntr') et
  fait l'addition des deux sur 'cntradd'
*)
let add_contour img cntr addcntr =
  for i = 0 to ((Sdlvideo.surface_info img).Sdlvideo.w - 1) do
    for j = 0 to ((Sdlvideo.surface_info img).Sdlvideo.h - 1) do
      if ((Sdlvideo.get_pixel_color cntr i j) = Sdlvideo.black) then
	Sdlvideo.put_pixel_color addcntr i j Sdlvideo.black
      else
	Sdlvideo.put_pixel_color addcntr i j (Sdlvideo.get_pixel_color img i j);
    done;
  done

(*
   Creer un BMP de meme taille que 'img' a l'adresse 'path'
*)
let create_BMP img path =
  let w = (Sdlvideo.surface_info img).Sdlvideo.w in
  let h = (Sdlvideo.surface_info img).Sdlvideo.h in
  let newBMP = Sdlvideo.create_RGB_surface_format img [] w h in
    for i = 0 to (w - 1) do
      for j = 0 to (h - 1) do
	Sdlvideo.put_pixel_color newBMP i j Sdlvideo.green;
      done;
    done;
    Sdlvideo.save_BMP newBMP (path)

(*
   Regroupe l'ensemble des fonctions precedantes. Elle demande l'image
   de base ('img') et un chemin d'enregistrement ('path') pour les
   deux fichiers qu'elle cree : un BMP avec juste les contours et
   deuxieme BMP qui est l'addition des contours sur l'image d'origine
*)
let contour_generator img path =
  create_BMP img (path^"cntr.bmp");
  create_BMP img (path^"cntradd.bmp");
  let cntr = Sdlvideo.load_BMP (path^"cntr.bmp") in
  let cntradd = Sdlvideo.load_BMP (path^"cntradd.bmp") in
    get_contour img cntr;
    add_contour img cntr cntradd;
    Sdlvideo.save_BMP cntr (path^"cntr.bmp");
    Sdlvideo.save_BMP cntradd (path^"cntradd.bmp")
